// src/utils/request.js
import axios from "axios";
import {
  getToken,
  getDataToken,
  clearDataToken,
  clearToken,
  clearUserInfo,
} from "../utils/userInfo";
import { useRouter } from "vue-router";
const router = useRouter();
// 创建没有基础地址的 axios 实例
const service = axios.create({
  timeout: 15000, // 保留超时时间配置
});

// 请求拦截器（自动携带 Token）
service.interceptors.request.use(
  (config) => {
    // 从存储中获取 token（可根据需要修改存储位置）
    const token = config.tokenType === 'identification' ? getToken() : getDataToken();
    // 如果 token 存在，则将其添加到请求头中
    // 注意：这里的 token 可能是一个对象，具体取决于你的实现
    // 如果 token 是对象，则需要根据实际情况进行处理
    // 例如：如果 token 是一个对象，可能需要使用 token.access_token 或其他属性
    if (token) {
      config.headers = config.headers || {};
      config.headers.Token = `${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// Token 过期处理逻辑
let isRefreshing = false;

// 响应拦截器
service.interceptors.response.use(
  (response) => {
     if (response && response.data && response.data.message?.indexOf('token') > -1) {
        if (!isRefreshing) {
          isRefreshing = true;
          handleTokenExpired();
        }
        router.push("/");
    } else {
      return response;
    }
  },
  (error) => {
    const { response } = error;
    if (response && response.data) {
      // 统一处理 401 状态码
      if (response?.data?.code === 401) {
        if (!isRefreshing) {
          isRefreshing = true;
          handleTokenExpired();
        }
        return Promise.reject(new Error("登录状态已过期，请重新登录"));
      }
    }
    

    // 其他错误处理
    const errorMessage = response?.data?.msg || `请求失败: ${error.message}`;
    return Promise.reject(new Error(errorMessage));
  }
);

// Token 过期处理函数
const handleTokenExpired = () => {
  clearDataToken();
  clearToken();
  clearUserInfo();
  // 根据实际路由库调整跳转方式
  // window.location.href = "/login";
};

// 核心请求函数
const request = async (config) => {
  try {
    // 注意：这里要求调用时必须传入完整的 URL
    const response = await service.request(config);
    return response;
  } catch (error) {
    throw error; // 抛出错误由调用方处理
  }
};

// 封装常用方法（支持完整 URL）
const http = {
  get: (url, config) => request({ ...config, url, method: "GET" }),
  post: (url, data, config) =>
    request({ ...config, url, data, method: "POST" }),
  put: (url, data, config) => request({ ...config, url, data, method: "PUT" }),
  delete: (url, config) => request({ ...config, url, method: "DELETE" }),
};

export { http, service as axiosInstance };
